home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 7 / FM Towns Free Software Collection 7.iso / t_os / kankyou / kankyou.doc < prev    next >
Text File  |  1993-11-30  |  8KB  |  163 lines

  1. T-OS V2.1環境を改善するプログラム         By Jouji
  2.  
  3. ★CHGCONT.COM,INTD9.COMについて
  4.  私はUXユーザーですが、GNU-CD Rel.2を手に入れ、開発環境を整え
  5. ようと増設RAMを買いました。スロットが1つしか無いので、奮発して8MByt
  6. eのを買いました。そこで、RAMディスクを6MByte設定しているわけです。
  7.  私は、普段はTUGiを使うことが多いので、RAMディスク上にTUGiを転送
  8. して、TMENUとしてTUGiを使っています。しかし、ときには純正のTMEN
  9. Uを使いたい場合が有るわけです。このときに、REIPLしてしまってはRAMデ
  10. ィスクの内容が全て消えてしまいます。REIPLせずに、TMENUを切り換える
  11. 方法は無いのでしょうか?
  12.  Oh!FM1991年7月号「INSIDE TOWNS CONTROL.EX
  13. Eの秘密」に、メモリ上のCONTROL.EXEのテーブルを書き換えることによ
  14. り、システムドライブを変更してしまうというプログラムSETMENU.COMが
  15. 載っています。これがぴったりなのですが、あいにくT-OS V1.1用です。V
  16. 2.1では動きそうもありません。
  17.  V2.1L10を起動し、SYMDEBでメモリ上のCONTROL.EXEを覗
  18. いてみると、案の定、共通テーブルの内容がV1.1とはずいぶん違っているようで
  19. す。int 0d9h によってESにセグメント値が返ってきますが(INTD9.COM
  20. により調べられます)、そのセグメントのオフセット044fh,0450h,0451h,0bb5h,0c45h,
  21. 0c5ch,0c73h,0d0ah,0d29h,0d3dh にドライブ名らしい文字があります。CONTRO
  22. L.EXEの起動時に
  23.  
  24.   control  -dI
  25.  
  26. のようにオプションを付けることにより起動ドライブ名を変更できますが、このよう
  27. に起動ドライブを変更するとこのオフセットの部分が変化します。起動ドライブがD
  28. :のときのこれらのオフセット位置にある文字列を次に示します。
  29.  
  30. 044F:"DDD:\RUN386.EXE"
  31. 0BB5:"D:\RUN386.exe"
  32. 0C45:"D:\SYSINIT\SYSINIT.EXE"
  33. 0C5C:"D:\HCOPY\COCO_MEM.EXE"
  34. 0C73:"D:\TMENU.EXP"
  35. 0D0A:"D:\HCOPY\DELDRV.EXP FORRBIOS"
  36. 0D29:"D:\HCOPY\ADDDRV.EXP D:\HCOPY\FORRBIOS.NSD"
  37.  
  38. この他にオフセット0e1dh のデータが、起動ドライブA:,B:,C:,‥‥に応じ
  39. て、0,1,2,‥‥と変化します。ここは、int 0d9h によってBXに返されるオ
  40. フセット位置の1番地手前で、前記Oh!FMの記事によるとTMENU.EXPの
  41. あるドライブ番号を意味しているようです。
  42.  ということで、メモリ上のCONTROL.EXEのこれらのドライブ情報を自由
  43. に操作できるプログラムを作ってみました。それがCHGCONT.COMです。ド
  44. ライブ情報のオフセット位置は、CONTROL.EXEのバージョンによって異な
  45. るかもしれません。T-OS V2.1L10のCONTROL.EXEはint 0d9h
  46. によってBXに 0e1eh が返ってきます。それで、int 0d9h によってこれ以外の値が
  47. 返ってきた場合は何もしないで終了するようにしました。まず、INTD9.COM
  48. によって、int 0d9h の戻り値を確かめて下さい。INTD9.COMの出力例を示
  49. します。
  50.  
  51.   ES:BX = 48C7:0E1E
  52.  
  53.  CHGCONT.COMは、10文字のパラメータにより前記10個のオフセット
  54. 位置のデータを書き換えます。また、オフセット0c73h のデータを示す7文字目のパ
  55. ラメータに連動して、オフセット0e1dh のデータも書き換えます。
  56.  実際の使用法ですが、起動ドライブをD:として、RAMディスクをI:とします。
  57. D:¥にはT-OS V2.1L10純正のTMENU.EXPを置いておきます。
  58. 起動時にTUGI.EXPをTMENU.EXPという名前でI:¥に転送しておき、
  59. RUN386.EXEもI:¥に転送しておきます。次のようなバッチ
  60.  
  61.   chgcont iiiiddiddd
  62.   i:
  63.  
  64. を実行すれば一瞬にしてTMENUとしてのTUGiが起動します。私はこのバッチ
  65. をアイテム登録しています。また、純正のTMENUに戻りたいときは次のようなバ
  66. ッチ
  67.  
  68.   chgcont iiiidddddd
  69.   d:
  70.  
  71. を実行すれば良いのです。REIPLしていませんから起動は速いし、RAMディス
  72. クの内容もそのままです。両者の間を何度でも往復できます。これは便利ですよ。も
  73. っとも、切り換え頻度が頻繁でRAMディスク容量が十分に多いのであれば、両方と
  74. もRAMディスクに転送しておいて、リネームするような切り換え方法の方が良いか
  75. もしれませんが。
  76.  
  77.  
  78. ★T-OSV2.1L20用CHGCONT2.COMについて
  79.  T-OSV2.1L20A付属のCONTROL.EXEでは、int 0d9h の返り
  80. 値は、例えば
  81.  
  82.   ES:BX = 48C7:1017
  83.  
  84. となり、ドライブ名のついた文字列は上のセングメントのオフセット値で
  85.  
  86. 0446:"DDD:\RUN386.EXE"
  87. 0D17:"D:\RUN386.exe"
  88. 0D27:"D:\RUN386.exe"
  89. 0DB7:"D:\SYSINT\SYSINT.EXE"
  90. 0DCE:"D:\HCOPY\COCO_MEM.EXE"
  91. 0DE4:"D:\SIDEWORK\SIDEWORK.EXE"
  92. 0DFE:"D:\TMENU.EXP"
  93. 0E95:"D:\HCOPY\DELDRV.EXP FORRBIOS"
  94. 0EB4:"D:\HCOPY\ADDDRV.EXP D:\HCOPY\FORRBIOS.NSD"
  95. 0EE0:"D:\HCOPY\DELDRV.EXP SMG"
  96. 0EFA:"D:\HCOPY\ADDDRV.EXP D:\HCOPY\NSDD\SMSG.NSD"
  97.  
  98. となっています。
  99.  これら全部変更可能にしてもしょうがないし、バッチファイルが分かりにくくなる
  100. だけですのでL20用は思いきって可変パラメータの数を減らして、0446h,0447h,
  101. 0448h,0d17h,0d27h,0dfeh のオフセット値の所だけにしました。
  102.  従って、L20でCHGCONT2を使う場合は、バッチファイル中で
  103.  
  104.   chgcont2 iiiiii
  105.   i:
  106.  
  107. のようにして下さい。
  108.  
  109.  
  110. ★CHGENV.COMについて
  111.  T-OSでは全てがCONTROL.EXEの子プロセスとして起動されるので、
  112. 環境変数を変更しようとしてもやりにくいですよね。いったんCONTROL.EX
  113. Eを終了させ、環境変数を変更して、再びCONTROL.EXEを起動しなければ
  114. なりません。しかも、この一連の処理を1つのバッチファイル内で行うのは不可能で
  115. す。
  116.  私は、何回もGCCを起動しなければならないときなどは、RAMディスクにGC
  117. Cのシステムをそっくり転送して、環境変数PATHとGNUを変更して、RAMデ
  118. ィスク上で開発を行おうと思い立ちました。しかし、環境変数の変更が意外と面倒で
  119. うまくいきません。そこで、こうなったら最後の手段というわけで、CONTROL.
  120. EXEの環境領域を書き換えてしまうというプログラムを作ってみました。
  121.  CHGENV.COMがそのプログラムです。動作は、いたって簡単、自分の環境
  122. 領域をCONTROL.EXEの環境領域にコピーするだけです。次のようなバッチ
  123. 中で使用します。
  124.  
  125.   set PATH=I:\;I:\USR\BIN;D:\;D:\DOS;D:\MASM;D:\T_TOOL;G:\BAT;G:\SCOM
  126.   set GNU=I:
  127.   chgenv
  128.  
  129. つまり、環境変数の変更はCOMMAND.COMにお任せで、CHGENV.CO
  130. Mは変更後の環境変数を環境領域もろともコピーするだけなのです。
  131.  CONTROL.EXEの環境領域は次のようにして求めています。int 0d9h に
  132. よってESに返されるセグメント値はCONTROL.EXEのコードセグメントら
  133. しいのでこの値から10h を引いてPSPアドレスを求めます。そのPSPのオフセッ
  134. ト2ch,2dh が環境領域のセグメントアドレスです。
  135.  このプログラムによってGCCもRAMディスク上で快適に動くようになり、ハー
  136. ドディスクのアクセスランプもほとんど点灯しなくなりました。めでたし、めでたし。
  137.  注意点が2つ有ります。CHGENV.COMは自分の環境領域をそっくりオーナ
  138. ー名まで含めてコピーしてしまうので、VMAP.COM等のメモリ表示ツールで表
  139. 示させると、CONTROL.EXEのはずの所がCHGENV.COMになってし
  140. まいます。まあ、気にしないで下さい。
  141.  それから、CHGENVはCONTROL.EXEの環境領域を変更しますから、
  142. 例えば、エディタVzを起動してエディタから前記のようなバッチを実行してもVz
  143. の環境変数は変更できません。Vzの起動前にバッチを実行して下さい。
  144.  なお、このプログラムを使用していて一度だけメモリアロケーションエラーが出て
  145. ハングアップ状態になったことがあります。MCBを壊したのだと思いますが原因は
  146. 不明です。
  147.  
  148.  
  149. ★ソースリスト*.ASMについて
  150.  ソースリストは一応MASM V4.0用なのですが、独自のインクル-ドファイ
  151. ルと構造化マクロを使用しているため、そのままではアセンブル出来ません。(類似
  152. の構造化マクロやMASM6を使用したりすれば移植は容易だと思います。)
  153.  リスト2のif_文等で使われている関係子は、条件付き分岐命令(jaやjbe)
  154. のjに続く文字と同じ意味を持っています。例えば、
  155.  
  156.   <al ae 'A'> * <al be 'Z'>
  157.  
  158. は、C言語で記述すれば次のようになります。
  159.  
  160.   (al >= 'A') && (al <= 'Z')
  161.  
  162. "*"はANDで、"+"はORの意味です。
  163.